{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapter 4 - Policy Gradient Methods"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import gym\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 315,
   "metadata": {},
   "outputs": [],
   "source": [
    "def running_mean(x, N=50):\n",
    "    kernel = np.ones(N)\n",
    "    conv_len = x.shape[0]-N\n",
    "    y = np.zeros(conv_len)\n",
    "    for i in range(conv_len):\n",
    "        y[i] = kernel @ x[i:i+N]\n",
    "        y[i] /= N\n",
    "    return y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "env = gym.make(\"CartPole-v0\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 4.4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 483,
   "metadata": {},
   "outputs": [],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "import torch\n",
    "\n",
    "l1 = 4 #A\n",
    "l2 = 150\n",
    "l3 = 2 #B\n",
    "\n",
    "model = torch.nn.Sequential(\n",
    "    torch.nn.Linear(l1, l2),\n",
    "    torch.nn.LeakyReLU(),\n",
    "    torch.nn.Linear(l2, l3),\n",
    "    torch.nn.Softmax(dim=0) #C\n",
    ")\n",
    "\n",
    "learning_rate = 0.009\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\n",
    "\n",
    "#A Input data is length 4\n",
    "#B Output is a 2-length vector for the Left and the Right actions\n",
    "#C Output is a softmax probability distribution over actions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 4.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 484,
   "metadata": {},
   "outputs": [],
   "source": [
    "state1 = env.reset()\n",
    "pred = model(torch.from_numpy(state1).float()) #G\n",
    "action = np.random.choice(np.array([0,1]), p=pred.data.numpy()) #H\n",
    "state2, reward, done, info = env.step(action) #I\n",
    "\n",
    "#G Call policy network model to produce predicted action probabilities\n",
    "#H Sample an action from the probability distribution produced by the policy network\n",
    "#I Take the action, receive new state and reward. The info variable is produced by the environment but is irrelevant"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 4.6"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 485,
   "metadata": {},
   "outputs": [],
   "source": [
    "def discount_rewards(rewards, gamma=0.99):\n",
    "    lenr = len(rewards)\n",
    "    disc_return = torch.pow(gamma,torch.arange(lenr).float()) * rewards #A\n",
    "    disc_return /= disc_return.max() #B\n",
    "    return disc_return\n",
    "\n",
    "#A Compute exponentially decaying rewards\n",
    "#B Normalize the rewards to be within the [0,1] interval to improve numerical stability"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 4.7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 486,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loss_fn(preds, r): #A\n",
    "    return -1 * torch.sum(r * torch.log(preds)) #B\n",
    "\n",
    "#A The loss function expects an array of action probabilities for the actions that were taken and the discounted rewards.\n",
    "#B It computes the log of the probabilities, multiplies by the discounted rewards, sums them all and flips the sign."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 4.8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 487,
   "metadata": {},
   "outputs": [],
   "source": [
    "MAX_DUR = 200\n",
    "MAX_EPISODES = 500\n",
    "gamma = 0.99\n",
    "score = [] #A\n",
    "expectation = 0.0\n",
    "for episode in range(MAX_EPISODES):\n",
    "    curr_state = env.reset()\n",
    "    done = False\n",
    "    transitions = [] #B\n",
    "    \n",
    "    for t in range(MAX_DUR): #C\n",
    "        act_prob = model(torch.from_numpy(curr_state).float()) #D\n",
    "        action = np.random.choice(np.array([0,1]), p=act_prob.data.numpy()) #E\n",
    "        prev_state = curr_state\n",
    "        curr_state, _, done, info = env.step(action) #F\n",
    "        transitions.append((prev_state, action, t+1)) #G\n",
    "        if done: #H\n",
    "            break\n",
    "\n",
    "    ep_len = len(transitions) #I\n",
    "    score.append(ep_len)\n",
    "    reward_batch = torch.Tensor([r for (s,a,r) in transitions]).flip(dims=(0,)) #J\n",
    "    disc_returns = discount_rewards(reward_batch) #K\n",
    "    state_batch = torch.Tensor([s for (s,a,r) in transitions]) #L\n",
    "    action_batch = torch.Tensor([a for (s,a,r) in transitions]) #M\n",
    "    pred_batch = model(state_batch) #N\n",
    "    prob_batch = pred_batch.gather(dim=1,index=action_batch.long().view(-1,1)).squeeze() #O\n",
    "    loss = loss_fn(prob_batch, disc_returns)\n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "\n",
    "#A List to keep track of the episode length over training time\n",
    "#B List of state, action, rewards (but we ignore the reward)\n",
    "#C While in episode\n",
    "#D Get the action probabilities\n",
    "#E Select an action stochastically\n",
    "#F Take the action in the environment\n",
    "#G Store this transition\n",
    "#H If game is lost, break out of the loop\n",
    "#I Store the episode length\n",
    "#J Collect all the rewards in the episode in a single tensor\n",
    "#K Compute the discounted version of the rewards\n",
    "#L Collect the states in the episode in a single tensor\n",
    "#M Collect the actions in the episode in a single tensor\n",
    "#N Re-compute the action probabilities for all the states in the episode\n",
    "#O Subset the action-probabilities associated with the actions that were actually taken "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 488,
   "metadata": {},
   "outputs": [],
   "source": [
    "score = np.array(score)\n",
    "avg_score = running_mean(score, 50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 489,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x120209fd0>]"
      ]
     },
     "execution_count": 489,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,7))\n",
    "plt.ylabel(\"Episode Duration\",fontsize=22)\n",
    "plt.xlabel(\"Training Epochs\",fontsize=22)\n",
    "plt.plot(avg_score, color='green')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Listing 4.9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 454,
   "metadata": {},
   "outputs": [],
   "source": [
    "score = []\n",
    "games = 100\n",
    "done = False\n",
    "state1 = env.reset()\n",
    "for i in range(games):\n",
    "    t=0\n",
    "    while not done: #F\n",
    "        pred = model(torch.from_numpy(state1).float()) #G\n",
    "        action = np.random.choice(np.array([0,1]), p=pred.data.numpy()) #H\n",
    "        state2, reward, done, info = env.step(action) #I\n",
    "        state1 = state2 \n",
    "        t += 1\n",
    "        if t > MAX_DUR: #L\n",
    "            break;\n",
    "    state1 = env.reset()\n",
    "    done = False\n",
    "    score.append(t)\n",
    "score = np.array(score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 455,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x11f711c50>"
      ]
     },
     "execution_count": 455,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(np.arange(score.shape[0]),score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:deeprl]",
   "language": "python",
   "name": "conda-env-deeprl-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
